//package com.vast.admin.service.impl;
//
//import cn.hutool.core.date.DateTime;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.core.metadata.IPage;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.vast.admin.entity.Menu;
//import com.vast.admin.entity.RoleMenu;
//import com.vast.admin.mapper.MenuMapper;
//import com.vast.admin.service.MenuService;
//import com.vast.admin.service.RoleMenuService;
//import com.vast.common.core.domain.entity.SysRole;
//import com.vast.common.core.domain.entity.SysUser;
//import com.vast.system.core.domain.AdminTreeSelect;
//import com.vast.system.domain.SysUserRole;
//import com.vast.system.mapper.SysRoleMapper;
//import com.vast.system.service.ISysUserRoleService;
//import com.vast.system.utils.Constant;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import java.util.*;
//import java.util.stream.Collectors;
//
//@Service
//public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {
//
//    @Autowired
//    private ISysUserRoleService managerRoleService;
//
//    @Autowired
//    private MenuService menuService;
//
//    @Autowired
//    private RoleMenuService roleMenuService;
//
//    @Autowired
//    private SysRoleMapper roleMapper;
//
//    @Override
//    public IPage<Menu> queryMenuTree(Page<Menu> page) {
//        // size 小于 0 不在查询 total 及分页，自动调整为列表模式。
//        // 注意！！这个地方自己控制好！！
//        page.setSize(-1);
//        //获取一级菜单
//        QueryWrapper<Menu> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq(Menu.COL_PARENT_ID, 0);
//        queryWrapper.orderByAsc(Menu.COL_SORT);
//        IPage<Menu> parentMenus = baseMapper.selectPage(page, queryWrapper);
//        for (Menu menu : parentMenus.getRecords()) {
//            menu.setChildren(getNextLevelMenus(menu,1));
//            if(menu.getChildren().size() > 0){
//                menu.setHasChildren(true);
//            }
//        }
//        return parentMenus;
//    }
//
//    @Override
//    public List<Menu> getMenuList() {
//        //获取一级菜单
//        QueryWrapper<Menu> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq(Menu.COL_PARENT_ID, 0);
//        queryWrapper.orderByAsc(Menu.COL_SORT);
//        List<Menu> parentMenus = baseMapper.selectList(queryWrapper);
//        for (Menu menu : parentMenus) {
//            menu.setChildren(getNextLevelMenus(menu, 1));
//            if(menu.getChildren().size() > 0){
//                menu.setHasChildren(true);
//            }
//        }
//        return parentMenus;
//    }
//
//    @Override
//    public List<Menu> getNav(SysUser manager) {
//
//        if(Arrays.asList(manager.getRoleIdList()).contains(Constant.SUPER_ADMIN)){
//            //获取一级菜单
//            QueryWrapper<Menu> queryWrapper = new QueryWrapper<>();
//            queryWrapper.eq(Menu.COL_PARENT_ID, 0);
//            queryWrapper.orderByAsc(Menu.COL_SORT);
//            List<Menu> parentMenus = baseMapper.selectList(queryWrapper);
//            for (Menu menu : parentMenus) {
//                menu.setChildren(getNextLevelMenus(menu, 0));
//                if(menu.getChildren().size() > 0){
//                    menu.setHasChildren(true);
//                }
//            }
//            return parentMenus;
//        }else{
//            List<SysUserRole> managerRoles = managerRoleService.list(new QueryWrapper<SysUserRole>().eq(SysUserRole.COL_MANAGER_ID,manager.getUserId()));
//            Set<Long> roleIds = new HashSet<>();
//            for (SysUserRole managerRole : managerRoles) {
//                roleIds.add(managerRole.getRoleId());
//            }
//            List<RoleMenu> roleMenus = roleMenuService.list(new QueryWrapper<RoleMenu>().in(RoleMenu.COL_ROLE_ID,roleIds));
//            Set<Long> menuIds = new HashSet<>();
//            for (RoleMenu roleMenu : roleMenus) {
//                menuIds.add(roleMenu.getMenuId());
//            }
//            //获取一级菜单
//            QueryWrapper<Menu> queryWrapper = new QueryWrapper<>();
//            queryWrapper.eq(Menu.COL_PARENT_ID, 0);
//            queryWrapper.in(Menu.COL_ID,menuIds);
//            queryWrapper.orderByAsc(Menu.COL_SORT);
//            List<Menu> parentMenus = baseMapper.selectList(queryWrapper);
//            for (Menu menu : parentMenus) {
//                menu.setChildren(getNextLevelMenus(menu, 0));
//                if(menu.getChildren().size() > 0){
//                    menu.setHasChildren(true);
//                    List<Menu> childMenus = new ArrayList<>();
//                    for (Long menuId : menuIds) {
//                        for (Menu child : menu.getChildren()) {
//                            if(child.getId().equals(menuId)){
//                               childMenus.add(child);
//                            }
//                        }
//                    }
//                    if(!childMenus.isEmpty()){
//                        Collections.sort(childMenus, new Comparator<Menu>() {
//                            @Override
//                            public int compare(Menu u1, Menu u2) {
//                                int diff = u1.getSort() - u2.getSort();
//                                if (diff > 0) {
//                                    return 1;
//                                } else if (diff < 0) {
//                                    return -1;
//                                }
//                                return 0; //相等为0
//                            }
//                        }); // 按年龄排序
//                    }
//                    menu.setChildren(childMenus);
//                }
//            }
//            return parentMenus;
//        }
//    }
//
//    @Override
//    public String getPermissions(SysUser manager) {
//        String permissions = "";
//        if(Arrays.asList(manager.getRoleIdList()).contains(Constant.SUPER_ADMIN)){
//            List<Menu> menuList = menuService.list();
//            if(menuList!= null &&!menuList.isEmpty()){
//                List<String> buttons = new ArrayList<>();
//                for (Menu menu : menuList) {
//                    //菜单类型:0 -菜单, 1-按钮
//                    if(menu.getType() == 1){
//                        buttons.add(menu.getPermissions());
//                    }
//                }
//                String[] buttonsPermissions = new String[buttons.size()];
//                buttons.toArray(buttonsPermissions);
//                permissions = Arrays.toString(buttonsPermissions);
//            }
//         }else{
//            List<SysUserRole> managerRoles = managerRoleService.list(new QueryWrapper<SysUserRole>().eq(SysUserRole.COL_MANAGER_ID,manager.getUserId()));
//            QueryWrapper<RoleMenu> roleMenuQueryWrapper =  new QueryWrapper<>();
//            Set<Long> roleIds = new HashSet<>();
//            for (SysUserRole managerRole : managerRoles) {
//                roleIds.add(managerRole.getRoleId());
////            roleMenuQueryWrapper.eq(RoleMenu.COL_ROLE_ID,managerRole.getRoleId()).or();
//            }
//            if(!roleIds.isEmpty()){
//                roleMenuQueryWrapper.in(RoleMenu.COL_ROLE_ID,roleIds);
//            }
//            List<RoleMenu> roleMenus = roleMenuService.list(roleMenuQueryWrapper);
//            QueryWrapper<Menu> menuQueryWrapper = new QueryWrapper<>();
//            Set<Long> menuIds = new HashSet<>();
//            for (RoleMenu roleMenu : roleMenus) {
//                menuIds.add(roleMenu.getMenuId());
////            menuQueryWrapper.eq(Menu.COL_ID,roleMenu.getMenuId()).or();
//            }
//            if(!menuIds.isEmpty()){
//                menuQueryWrapper.in(Menu.COL_ID,menuIds);
//            }
////        menuQueryWrapper.eq(Menu.COL_TYPE, 1);//
//            List<Menu> menuList = menuService.list(menuQueryWrapper);
//            if(menuList!= null &&!menuList.isEmpty()){
//                List<String> buttons = new ArrayList<>();
//                for (Menu menu : menuList) {
//                    //菜单类型:0 -菜单, 1-按钮
//                    if(menu.getType() == 1){
//                        buttons.add(menu.getPermissions());
//                    }
//                }
//                String[] buttonsPermissions = new String[buttons.size()];
//                buttons.toArray(buttonsPermissions);
//                permissions = Arrays.toString(buttonsPermissions);
//            }
//        }
//        return permissions;
//    }
//
//    @Override
//    public List<String> getManagerPermissions(Long managerId) {
//        List<SysUserRole> managerRoles = managerRoleService.list(new QueryWrapper<SysUserRole>().eq(SysUserRole.COL_MANAGER_ID,managerId));
//        QueryWrapper<RoleMenu> roleMenuQueryWrapper =  new QueryWrapper<>();
////        for (ManagerRole managerRole : managerRoles) {
////            roleMenuQueryWrapper.eq(RoleMenu.COL_ROLE_ID,managerRole.getRoleId()).or();
////        }
////        List<RoleMenu> roleMenus = roleMenuService.list(roleMenuQueryWrapper);
////        QueryWrapper<Menu> menuQueryWrapper = new QueryWrapper<>();
////        for (RoleMenu roleMenu : roleMenus) {
////            menuQueryWrapper.eq(Menu.COL_ID,roleMenu.getMenuId()).or();
////        }
//        Set<Long> roleIds = new HashSet<>();
//        for (SysUserRole managerRole : managerRoles) {
//            roleIds.add(managerRole.getRoleId());
////            roleMenuQueryWrapper.eq(RoleMenu.COL_ROLE_ID,managerRole.getRoleId()).or();
//        }
//        if(!roleIds.isEmpty()){
//            roleMenuQueryWrapper.in(RoleMenu.COL_ROLE_ID,roleIds);
//        }
//        List<RoleMenu> roleMenus = roleMenuService.list(roleMenuQueryWrapper);
//        QueryWrapper<Menu> menuQueryWrapper = new QueryWrapper<>();
//        Set<Long> menuIds = new HashSet<>();
//        for (RoleMenu roleMenu : roleMenus) {
//            menuIds.add(roleMenu.getMenuId());
////            menuQueryWrapper.eq(Menu.COL_ID,roleMenu.getMenuId()).or();
//        }
//        if(!menuIds.isEmpty()){
//            menuQueryWrapper.in(Menu.COL_ID,menuIds);
//        }
////        menuQueryWrapper.eq(Menu.COL_TYPE, 1);//
//        List<Menu> menuList = menuService.list(menuQueryWrapper);
//        List<String> buttons = new ArrayList<>();
//        if(menuList!= null &&!menuList.isEmpty()){
//            for (Menu menu : menuList) {
//                //菜单类型:0 -菜单, 1-按钮
//                if(menu.getType() == 1){
//                    buttons.add(menu.getPermissions());
//                }
//            }
//
//        }
//        return buttons;
//    }
//
//    @Override
//    public boolean addOrUpdate(SysUser manager, Menu menu) {
//        if (menu.getId() == null) {
//            menu.setCreateBy(manager.getUserId());
//            menu.setUpdateBy(manager.getUserId());
//            menu.setCreateTime(DateTime.now());
//            menu.setUpdateTime(DateTime.now());
//            menu.setValid(1);
//            return baseMapper.insert(menu) == 1;
//        } else {
//            menu.setUpdateBy(manager.getUserId());
//            menu.setUpdateTime(DateTime.now());
//            menu.setValid(1);
//            return baseMapper.updateById(menu) == 1;
//        }
//    }
//
//    @Override
//    public Menu info(SysUser manager, Long id) {
//        return baseMapper.selectById(id);
//    }
//
//    @Override
//    public boolean delete(SysUser manager, Long id) {
//        int count = baseMapper.deleteById(id);
//        return count == 1;
//    }
//
//    @Override
//    public List<Menu> selectMenuList(Long userId) {
//        return selectMenuList(new Menu(), userId);
//    }
//
//    /**
//     * 查询系统菜单列表
//     *
//     * @param menu 菜单信息
//     * @return 菜单列表
//     */
//    @Override
//    public List<Menu> selectMenuList(Menu menu, Long userId)
//    {
//        List<Menu> menuList = null;
//        // 管理员显示所有菜单信息
//        if (SysUser.isAdmin(userId))
//        {
//            menuList = baseMapper.selectMenuList(menu);
//        }
//        else
//        {
//            menu.getParams().put("userId", userId);
//            menuList = baseMapper.selectMenuListByUserId(menu);
//        }
//        return menuList;
//    }
//
//    @Override
//    public List<Long> selectMenuListByRoleId(Long roleId) {
//        SysRole role = roleMapper.selectById(roleId);
//        return baseMapper.selectMenuListByRoleId(roleId);
//    }
//
//    @Override
//    public List<AdminTreeSelect> buildMenuTreeSelect(List<Menu> menus) {
//        List<Menu> menuTrees = buildMenuTree(menus);
//        return  menuTrees.stream().map(AdminTreeSelect::new).collect(Collectors.toList());
//    }
//
//    /**
//     * @param menu
//     * @param type 0 : 查询到菜单级, 1 - 查询到按钮级 2: 无
//     * @return
//     */
//    private List<Menu> getNextLevelMenus(Menu menu, int type) {
//        QueryWrapper<Menu> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq(Menu.COL_PARENT_ID, menu.getId());
//        if(type == 0){
//            queryWrapper.eq(Menu.COL_TYPE, type);
//        }
//        queryWrapper.orderByAsc(Menu.COL_SORT);
//        List<Menu> levelMenus = baseMapper.selectList(queryWrapper);
//        if(type == 1){
//            for (Menu sonMenu : levelMenus) {
//                sonMenu.setChildren(getNextLevelMenus(sonMenu,2));
//                if(sonMenu.getChildren().size() > 0){
//                    sonMenu.setHasChildren(true);
//                }
//            }
//        }
//        return levelMenus;
//    }
//
//
//    /**
//     * 构建前端所需要树结构
//     *
//     * @param menus 菜单列表
//     * @return 树结构列表
//     */
//    @Override
//    public List<Menu> buildMenuTree(List<Menu> menus)
//    {
//        List<Menu> returnList = new ArrayList<Menu>();
//        List<Long> tempList = new ArrayList<Long>();
//        for (Menu dept : menus)
//        {
//            tempList.add(dept.getId());
//        }
//        for (Iterator<Menu> iterator = menus.iterator(); iterator.hasNext();)
//        {
//            Menu menu = (Menu) iterator.next();
//            // 如果是顶级节点, 遍历该父节点的所有子节点
//            if (!tempList.contains(menu.getParentId()))
//            {
//                recursionFn(menus, menu);
//                returnList.add(menu);
//            }
//        }
//        if (returnList.isEmpty())
//        {
//            returnList = menus;
//        }
//        return returnList;
//    }
//
//
//    /**
//     * 递归列表
//     *
//     * @param list
//     * @param t
//     */
//    private void recursionFn(List<Menu> list, Menu t)
//    {
//        // 得到子节点列表
//        List<Menu> childList = getChildList(list, t);
//        t.setChildren(childList);
//        for (Menu tChild : childList)
//        {
//            if (hasChild(list, tChild))
//            {
//                recursionFn(list, tChild);
//            }
//        }
//    }
//
//
//    /**
//     * 得到子节点列表
//     */
//    private List<Menu> getChildList(List<Menu> list, Menu t)
//    {
//        List<Menu> tlist = new ArrayList<Menu>();
//        Iterator<Menu> it = list.iterator();
//        while (it.hasNext())
//        {
//            Menu n = (Menu) it.next();
//            if (n.getParentId().longValue() == t.getId().longValue())
//            {
//                tlist.add(n);
//            }
//        }
//        return tlist;
//    }
//
//    /**
//     * 判断是否有子节点
//     */
//    private boolean hasChild(List<Menu> list, Menu t)
//    {
//        return getChildList(list, t).size() > 0 ? true : false;
//    }
//}
//
//
//
//
//
//
